﻿using System;
using System.Drawing;
using System.Web.UI.HtmlControls;
using Metodesa.Logic;
using METODESA.Server.Data.Exceptions;
using Metodesa.Tools;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Nhibernate;

namespace Metodesa.Views.Home
{
    public partial class DetailsCompra : System.Web.UI.Page
    {
        public HtmlTable table;
        public static bool first;
        protected void Page_Load(object sender, EventArgs e)
        {
            first = false;
            if (Session["User"] != null)
            {
                Empleado usuario = (Empleado)Session["User"];
                
            }
            else
            {
                Response.Redirect("../../Views/Home/Index.aspx", true);
            }
            int ids=-1;
            OrdenCompra compra;
            if (Id.Value == null || Id.Value == "")
            {
                if (!int.TryParse(Request.QueryString.Get("id"), out ids))
                    Response.Redirect("../../Views/Home/ListCompra.aspx", true);
                Id.Value = ids.ToString();
                first = true;
                
            }
            else
            {
                ids = int.Parse(Id.Value);
                
            }
            string action=Request.QueryString.Get("a");
            if(action=="d")
            {
                int detalleId;
                if (int.TryParse(Request.QueryString.Get("det"), out detalleId))
                    deleteDetalle(detalleId);
            }

            compra = CompraDao.getCompraById(ids);
            if (compra == null)
                Response.Redirect("../../Views/Home/ListCompra.aspx", true);
            else{

                preparePage(compra);
            }
        }

        private void deleteDetalle(int idDetalle)
        {
            try
            {
                CompraLogic.deleteDetalle(int.Parse(Id.Value),idDetalle);
            }
            #region manejo de errores
            catch (EntityCouldntBeUpdated exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo borrar el detalle";
                Session.Add("Error", exception);
            }

            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }

        private void preparePage(OrdenCompra compra)
        {
            if (first)
                CompraLogic.reCalculatePrices(Id.Value);
            labelCodigo.Text = compra.Id.ToString();
            labelEmpleado.Text = compra.Empleado.Nombre + " " + compra.Empleado.Apellido;
            labelMonto.Text = compra.Monto.ToString();
            labelProveedor.Text = compra.Proveedor.Nombre;
            bool closed = compra.Estado == 1;
            PanelAdd.Visible = !closed; // Si no esta cerrado el panel es visible
            ButtonCerrar.Visible = !closed;
            table = ComprasTools.ListDetalleCompra(compra.detalleCompra, compra.Id, closed);
            ListDetalles.Controls.Clear();
            if (table!=null)
            ListDetalles.Controls.Add(table);
            if(DropDownListProductos.SelectedItem==null && !closed)
                DropDownListProductos = ProductosTools.addProductoCompra(DropDownListProductos,compra.Proveedor.producto);
        }

        protected void DropDownListProductos_SelectedIndexChanged(object sender, EventArgs e)
        {
            int id = int.Parse(DropDownListProductos.SelectedValue);
            Producto producto = ProductoDao.getProductoById(id);
            labelPrecio.Text = producto.Precio.ToString();
            int cantidad;
            if (int.TryParse(textCantidad.Text, out cantidad))
                labelPrecioTotal.Text = (cantidad*producto.Precio).ToString();
            else
            {
                textCantidad.Text = "0";
                labelPrecioTotal.Text = "0";
            }

        }

        protected void textCantidad_TextChanged(object sender, EventArgs e)
        {
            int id = int.Parse(DropDownListProductos.SelectedValue);
            Producto producto = ProductoDao.getProductoById(id);
            labelPrecio.Text = producto.Precio.ToString();
            int cantidad;
            if (int.TryParse(textCantidad.Text, out cantidad) )
                labelPrecioTotal.Text = (cantidad * producto.Precio).ToString();
            else
            {
                textCantidad.Text = "0";
                labelPrecioTotal.Text = "0";
               
            }

        }

        protected void addButton_Click(object sender, EventArgs e)
        {
            try
            {
                int idProducto = int.Parse(DropDownListProductos.SelectedValue);
                double monto;
                //TODO manejar la excepcion
                DetalleCompra detalle = CompraLogic.AddDetalleCompra(idProducto, Id.Value, textCantidad.Text, out monto);
                if (detalle != null)
                {
                    bool closed = detalle.OrdenCompra.Estado == 1;
                    table = ComprasTools.ConcatListDetalleCompra(detalle, table, int.Parse(Id.Value), closed);
                    labelMonto.Text = monto.ToString();
                }
            }
            #region manejo de errores
            catch (EntityCouldntBeSaved exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo agregar el detalle";
     
                Session.Add("Error", exception);
            }

            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }

        protected void ButtonCerrar_Click(object sender, EventArgs e)
        {
            try
            {       
                OrdenCompra compra=CompraLogic.Close(Id.Value);
                ButtonCerrar.Visible = false;
                PanelAdd.Visible = false;
                bool closed = compra.Estado == 1;
                table = ComprasTools.ListDetalleCompra(compra.detalleCompra, compra.Id, closed);
                ListDetalles.Controls.Clear();
                if (table != null)
                    ListDetalles.Controls.Add(table);
            }
            #region manejo de errores
            catch (EntityCouldntBeUpdated exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo cerrar la compra";
                Session.Add("Error", exception);
            }

            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }

        
    }
}
